home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / emul / cp4 / c2p_src / c2p_windowscale.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  16KB  |  584 lines

  1. /* :ts=4                            c2p_windowscale.c
  2.  *
  3.  *    cp4 - Commodore C+4 emulator
  4.  *    Copyright (C) 1998 Gáti Gergely
  5.  *
  6.  *    This program is free software; you can redistribute it and/or modify
  7.  *    it under the terms of the GNU General Public License as published by
  8.  *    the Free Software Foundation; either version 2 of the License, or
  9.  *    (at your option) any later version.
  10.  *
  11.  *    This program is distributed in the hope that it will be useful,
  12.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *    GNU General Public License for more details.
  15.  *
  16.  *    You should have received a copy of the GNU General Public License
  17.  *    along with this program; if not, write to the Free Software Foundation,
  18.  *    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19.  *
  20.  *    e-mail: gatig@dragon.klte.hu
  21.  */
  22. #include <proto/graphics.h>
  23. #include <proto/exec.h>
  24. #include <exec/alerts.h>
  25. #include <proto/intuition.h>
  26. #include <intuition/pointerclass.h>
  27. #include <proto/gadtools.h>
  28. #include <proto/layers.h>
  29.  
  30. #include "cp4_ver.h"
  31.  
  32. #define C2P_VERSION        "1"
  33. #define C2P_REVISION    "3"
  34. #define C2P_AUTHOR        "gega <Gáti Gergely>"
  35. #define C2P_NAME        "WindowScale"
  36. #define C2P_DATE        DATE
  37. #define C2P_NOSPEED
  38. #define C2P_LOCALIZE
  39.  
  40. #include "c2p_module.c"
  41. #include "c2p_windowscale_palette.c"
  42. #include "c2p_color_priority.c"
  43.  
  44.  
  45. struct GfxBase *GfxBase=NULL;
  46. struct IntuitionBase *IntuitionBase=NULL;
  47. struct Library *GadToolsBase=NULL;
  48. struct Library *LayersBase=NULL;
  49. static struct BitMap *bmap=NULL,*bmap2=NULL;
  50. static struct Window *win=NULL;
  51. static struct BitMap mybmap;
  52. static void *mypointer=NULL;
  53. static UWORD *mypntchip0=NULL;
  54. static UWORD *mypntchip1=NULL;
  55. static struct ColorMap *colmap=NULL;
  56. static struct BitMap *bmapwpx;
  57. static struct RastPort *tmpraswpx;
  58. static struct RastPort *raswpx;
  59. static int winsleeped=0;
  60. static struct Requester InvisibleRequester;
  61. static LONG PenTable[256];
  62. static unsigned char PenArray[SCRSIZE];
  63. static struct BitScaleArgs scaleargs;
  64. static struct Menu *mMenus=NULL;
  65. static APTR visualinfo=NULL;
  66. /* LORES-POINTER
  67.  */
  68. #define POINTERHEIGHT    31
  69. static UWORD pointerp0[]={ 0,384,384,3504,3504,3504,28080,28080,28080,28086,28086,28086,32758,32758,32766,32766,32764,16380,16376,16376,0,32764,0,32764,32740,32764,32740,32764,32764,32736,28672 };
  70. static UWORD pointerp1[]={ 384,960,4080,8184,8184,32760,65528,65528,65534,65535,65535,65535,65535,65535,65535,65535,65534,32766,32764,32764,65534,65534,65534,32770,32794,32770,32794,32770,32770,32768,32768 };
  71.  
  72. /* prefs
  73.  */
  74. static int WTop,WLeft,WHeight,WWidth;
  75. static char *WPubName=NULL;
  76.  
  77.  
  78. /* Protos
  79.  */
  80. static char *initgfx(void);
  81. static void freegfx(void);
  82. static int mReset(struct IntuiMessage *imsg);
  83. static int mHReset(struct IntuiMessage *imsg);
  84. static int mDebug(struct IntuiMessage *imsg);
  85. static int mPrefs(struct IntuiMessage *imsg);
  86. static int mJump(struct IntuiMessage *imsg);
  87. static int mQuit(struct IntuiMessage *imsg);
  88.  
  89. #define MSG_PROJECT            0
  90. #define MSG_RESET            1
  91. #define MSG_HARDRESET        2
  92. #define MSG_DEBUG            3
  93. #define MSG_PREFS            4
  94. #define MSG_QUIT            5
  95. #define MSG_OPTIONS            6
  96. #define MSG_JUMPSCR            7
  97. #define MSG_INFO            8
  98. #define MSG_ERRVISUALINFO    9
  99. #define MSG_ERRCREATEMENU    10
  100. #define MSG_ERROPENWIN        11
  101. #define MSG_ERRBITMAPATTR    12
  102. #define MSG_ERRBITPNUM        13
  103. #define MSG_ERRFINDCOLMAP    14
  104. #define MSG_ERROBTPENS        15
  105. #define MSG_ERRGRAPHICS        16
  106. #define MSG_ERRINTUITION    17
  107. #define MSG_ERRLAYERS        18
  108. #define MSG_ERRGADTOOLS        19
  109. #define MSG_ERRPOINTER        20
  110. #define MSG_RESET_A            21
  111. #define MSG_HARDRESET_A        22
  112. #define MSG_DEBUG_A            23
  113. #define MSG_PREFS_A            24
  114. #define MSG_QUIT_A            25
  115. #define MSG_JUMPSCR_A        26
  116. #define MSG_NOMEM            27
  117.  
  118. static char *defstr[]={
  119.     "Project",
  120.     "Reset",
  121.     "HardReset",
  122.     "Debug...",
  123.     "Prefs...",
  124.     "Quit",
  125.     "Options",
  126.     "Jump PubScreen",
  127.     "Plus4 on a scaleable Workbench window! Works on GFX cards and AGA too.",
  128.     "Can't find VisualInfo",
  129.     "Can't Create Menu",
  130.     "Can't open Window",
  131.     "Wrong BitMap Attributes",
  132.     "Wrong BitPlane Number",
  133.     "Can't Find ColorMap",
  134.     "Can't Obtain Pens",
  135.     "Can't open graphics.library V39",
  136.     "Can't open intuition.library V37",
  137.     "Can't open layers.library V33",
  138.     "Can't open gadtools.library V37",
  139.     "Can't Create Pointer",
  140.     "R",
  141.     "H",
  142.     "D",
  143.     "P",
  144.     "X",
  145.     "J",
  146.     "Not enough memory",
  147.     NULL
  148. };
  149.  
  150.  
  151. /* Menu
  152.  */
  153. static struct NewMenu mNewMenu[]={
  154.     {    NM_TITLE, (STRPTR)MSG_PROJECT, NULL, 0, NULL, NULL    },
  155.     {    NM_ITEM, (STRPTR)MSG_RESET, (STRPTR)MSG_RESET_A, 0, 0L, (APTR)mReset },
  156.     {    NM_ITEM, (STRPTR)MSG_HARDRESET, (STRPTR)MSG_HARDRESET_A, 0, 0L, (APTR)mHReset },
  157.     {    NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL    },
  158.     {    NM_ITEM, (STRPTR)MSG_DEBUG, (STRPTR)MSG_DEBUG_A, 0, 0L, (APTR)mDebug },
  159.     {    NM_ITEM, (STRPTR)MSG_PREFS, (STRPTR)MSG_PREFS_A, 0, 0L, (APTR)mPrefs },
  160.     {    NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL    },
  161.     {    NM_ITEM, (STRPTR)MSG_QUIT, (STRPTR)MSG_QUIT_A, 0, 0L, (APTR)mQuit },
  162.     {    NM_TITLE, (STRPTR)MSG_OPTIONS, NULL, 0, NULL, NULL    },
  163.     {    NM_ITEM, (STRPTR)MSG_JUMPSCR, (STRPTR)MSG_JUMPSCR_A, 0, 0L, (APTR)mJump },
  164.     {    NM_END, NULL, NULL, 0, 0L, NULL    }
  165. };
  166. static struct NewMenu sNewMenu[]={
  167.     {    NM_TITLE, (STRPTR)MSG_PROJECT, NULL, 0, NULL, NULL    },
  168.     {    NM_ITEM, (STRPTR)MSG_RESET, (STRPTR)MSG_RESET_A, 0, 0L, (APTR)mReset },
  169.     {    NM_ITEM, (STRPTR)MSG_HARDRESET, (STRPTR)MSG_HARDRESET_A, 0, 0L, (APTR)mHReset },
  170.     {    NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL    },
  171.     {    NM_ITEM, (STRPTR)MSG_DEBUG, (STRPTR)MSG_DEBUG_A, 0, 0L, (APTR)mDebug },
  172.     {    NM_ITEM, (STRPTR)MSG_PREFS, (STRPTR)MSG_PREFS_A, 0, 0L, (APTR)mPrefs },
  173.     {    NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL    },
  174.     {    NM_ITEM, (STRPTR)MSG_QUIT, (STRPTR)MSG_QUIT_A, 0, 0L, (APTR)mQuit },
  175.     {    NM_TITLE, (STRPTR)MSG_OPTIONS, NULL, 0, NULL, NULL    },
  176.     {    NM_ITEM, (STRPTR)MSG_JUMPSCR, (STRPTR)MSG_JUMPSCR_A, 0, 0L, (APTR)mJump },
  177.     {    NM_END, NULL, NULL, 0, 0L, NULL    }
  178. };
  179.  
  180.  
  181. char *SAVEDS minfo(void) {
  182. static char in[1024];
  183.     char *s;
  184.     c2p_OpenCatalog(defstr);
  185.     s=STR(MSG_INFO);
  186.     c2p_strncpy(in,s,1023);
  187.     c2p_CloseCatalog();
  188.     return(in);
  189. }
  190.  
  191. /* Handle MenuPick
  192.  */
  193. static int mReset(struct IntuiMessage *imsg) {
  194.     return(RET_RESET);
  195. } // mReset()
  196.  
  197. static int mHReset(struct IntuiMessage *imsg) {
  198.     return(RET_HRESET);
  199. } // mHReset()
  200.  
  201. static int mDebug(struct IntuiMessage *imsg) {
  202.     return(RET_DEBUG);
  203. } // mDebug()
  204.  
  205. static int mPrefs(struct IntuiMessage *imsg) {
  206.     return(RET_PREFS);
  207. } // mPrefs()
  208.  
  209. static int mQuit(struct IntuiMessage *imsg) {
  210.     return(RET_QUIT);
  211. } // mQuit()
  212.  
  213. static int mJump(struct IntuiMessage *imsg) {
  214. static char newname[MAXPUBSCREENNAME+1];
  215.     int r=RET_OK,i;
  216.     char *s;
  217.  
  218.     if(NULL!=(NextPubScreen(vec.c2p_Scr,newname))) {
  219.         if(NULL!=(s=AllocVec(MAXPUBSCREENNAME+1,MEMF_ANY))) {
  220.             freegfx();
  221.             r=RET_NEWWIN;
  222.             for(i=0;newname[i]!='\0';i++);
  223.             CopyMem(newname,s,i+1);
  224.             if(WPubName) FreeVec(WPubName);
  225.             WPubName=s;
  226.             if(NULL!=(initgfx())) {
  227.                 freegfx();
  228.                 // PANIC!!!
  229.                 Alert(AT_Recovery|AG_NoMemory|AO_Unknown);
  230.                 return(RET_ERROR);
  231.             }
  232.         }
  233.     }
  234.     return(r);
  235. } // mJump()
  236.  
  237.  
  238. static char *initgfx(void) {
  239. static char pname[MAXPUBSCREENNAME+1];
  240.     int planes,i,j;
  241.     ULONG r,g,b,wa_top=WA_Top;
  242.  
  243.     for(i=0;i<256;i++) PenTable[i]=-1;
  244.  
  245.     /* Get the required PubScreen
  246.      */
  247.     if(NULL==(vec.c2p_Scr=LockPubScreen(WPubName))) {
  248.         vec.c2p_Scr=LockPubScreen(NULL);
  249.         GetDefaultPubScreen(pname);
  250.         if(WPubName) FreeVec(WPubName);
  251.         for(i=0;pname[i]!='\0';i++);
  252.         if(NULL==(WPubName=AllocVec(i+2,MEMF_ANY))) return(STR(MSG_NOMEM));
  253.         CopyMem(pname,WPubName,i+1);
  254.     }
  255.  
  256.     /* ScreenToFront
  257.      */
  258.     ScreenToFront(vec.c2p_Scr);
  259.  
  260.     /* Get Screen Attribs
  261.      */
  262.     planes=vec.c2p_Scr->BitMap.Depth;
  263.     if(!(visualinfo=GetVisualInfo(vec.c2p_Scr,TAG_DONE))) return(STR(MSG_ERRVISUALINFO));
  264.  
  265.     /* SetUp Menu
  266.      */
  267.     for(i=0;sNewMenu[i].nm_Type!=NM_END;i++) {
  268.         mNewMenu[i].nm_Label=sNewMenu[i].nm_Label;
  269.         mNewMenu[i].nm_CommKey=sNewMenu[i].nm_CommKey;
  270.     }
  271.     for(i=0;mNewMenu[i].nm_Type!=NM_END;i++) {
  272.         if(mNewMenu[i].nm_Label!=NM_BARLABEL) mNewMenu[i].nm_Label=STR((long)mNewMenu[i].nm_Label);
  273.         if(mNewMenu[i].nm_CommKey!=NULL) mNewMenu[i].nm_CommKey=STR((long)mNewMenu[i].nm_CommKey);
  274.     }
  275.     if(!(mMenus=CreateMenus(mNewMenu,GTMN_FrontPen,0L,TAG_DONE,0L))) return(STR(MSG_ERRCREATEMENU));
  276.     LayoutMenus(mMenus,visualinfo,GTMN_TextAttr,(ULONG)vec.c2p_Scr->Font,GTMN_NewLookMenus,TRUE,TAG_DONE,0L);
  277.  
  278.     /* Open window
  279.      */
  280.     if(WTop==-1) { wa_top=TAG_IGNORE; WTop=0; }
  281.     if((win=(struct Window *)OpenWindowTags(NULL,
  282.                 WA_Left, WLeft,
  283.                 wa_top, WTop,
  284.                 WA_Width, WWidth,
  285.                 WA_Height, WHeight,
  286.                 WA_Title, (ULONG)"WindowScale",
  287.                 WA_Flags,    WFLG_SIZEGADGET|
  288.                             WFLG_SIZEBBOTTOM|
  289.                             WFLG_DRAGBAR|
  290.                             WFLG_DEPTHGADGET|
  291.                             WFLG_CLOSEGADGET|
  292.                             WFLG_GIMMEZEROZERO|
  293.                             WFLG_SMART_REFRESH|
  294.                             WFLG_ACTIVATE,
  295.                 WA_MinWidth,60,
  296.                 WA_MinHeight,40,
  297.                 WA_MaxWidth,(ULONG)~0,
  298.                 WA_MaxHeight,(ULONG)~0,
  299.                 WA_AutoAdjust, TRUE,
  300.                 WA_RptQueue, 25,
  301.                 WA_IDCMP,    IDCMP_CLOSEWINDOW|
  302.                             IDCMP_MENUPICK,
  303.                 WA_PubScreen, (ULONG)vec.c2p_Scr,
  304.                 WA_PubScreenFallBack, TRUE,
  305.                 WA_NewLookMenus, TRUE,
  306.                 TAG_DONE,0L ))==NULL)
  307.         return(STR(MSG_ERROPENWIN));
  308.     SetMenuStrip(win,mMenus);
  309.     vec.c2p_Win=win;
  310.     winsleeped=0;
  311.  
  312.     /* Allocate bitmap
  313.      */
  314.     if(NULL==(bmap=AllocBitMap(SCRWIDTH,SCRHEIGHT,planes,BMF_CLEAR,NULL))) return(STR(MSG_NOMEM));
  315.     if(NULL==(bmap2=AllocBitMap(vec.c2p_Scr->Width,vec.c2p_Scr->Height,planes,BMF_CLEAR,win->RPort->BitMap))) return(STR(MSG_NOMEM));
  316.  
  317.     /* Allocate & Init TMP rasters for WritePixel...
  318.      */
  319.     bmapwpx=AllocBitMap(SCRWIDTH,1,planes,BMF_CLEAR,NULL);
  320.     if(bmapwpx==NULL) return(STR(MSG_NOMEM));
  321.     tmpraswpx=AllocVec(sizeof(struct RastPort),MEMF_ANY);
  322.     if(tmpraswpx==NULL) return(STR(MSG_NOMEM));
  323.     InitRastPort(tmpraswpx);
  324.     tmpraswpx->BitMap=bmapwpx;
  325.     raswpx=AllocVec(sizeof(struct RastPort),MEMF_ANY);
  326.     if(raswpx==NULL) return(STR(MSG_NOMEM));
  327.     InitRastPort(raswpx);
  328.     raswpx->BitMap=bmap;
  329.  
  330.     /* Default BitScaleArgs
  331.      */
  332.     scaleargs.bsa_SrcX=scaleargs.bsa_SrcY=0;
  333.     scaleargs.bsa_SrcWidth=SCRWIDTH;
  334.     scaleargs.bsa_SrcHeight=SCRHEIGHT;
  335.     scaleargs.bsa_DestX=scaleargs.bsa_DestY=0;                    // SET IT-
  336.     scaleargs.bsa_DestWidth=scaleargs.bsa_DestHeight=0;            // SET IT
  337.     scaleargs.bsa_XSrcFactor=SCRWIDTH;
  338.     scaleargs.bsa_YSrcFactor=SCRHEIGHT;
  339.     scaleargs.bsa_XDestFactor=scaleargs.bsa_YDestFactor=0;        // SET IT
  340.     scaleargs.bsa_SrcBitMap=bmap;
  341.     scaleargs.bsa_DestBitMap=bmap2;
  342.     scaleargs.bsa_Flags=0;
  343.  
  344.     /* SetUp PenTable
  345.      */
  346.     if(NULL==(colmap=vec.c2p_Scr->ViewPort.ColorMap)) return(STR(MSG_ERRFINDCOLMAP));
  347.     for(i=0;i<256;i++) {
  348.         j=ColorPriority[i]*3;
  349.         r=Palette[j];
  350.         g=Palette[j+1];
  351.         b=Palette[j+2];
  352.         if(-1==(PenTable[ColorPriority[i]]=ObtainBestPen(colmap,r,g,b,OBP_Precision,PRECISION_GUI,TAG_DONE))) return(STR(MSG_ERROBTPENS));
  353.     }
  354.     return(NULL);
  355. } // initgfx()
  356.  
  357.  
  358. static void freegfx(void) {
  359.     int i;
  360.  
  361.     mawake();
  362.     if(GfxBase) {
  363.         WaitTOF();
  364.         if(colmap) for(i=0;i<256;i++) if(PenTable[i]!=-1) ReleasePen(colmap,PenTable[i]);
  365.     }
  366.     if(win) {
  367.         WTop=win->TopEdge;
  368.         WLeft=win->LeftEdge;
  369.         WHeight=win->Height;
  370.         WWidth=win->Width;
  371.         vec.c2p_AddOptionInt("WINTOP",WTop);
  372.         vec.c2p_AddOptionInt("WINLEFT",WLeft);
  373.         vec.c2p_AddOptionInt("WINHEIGHT",WHeight);
  374.         vec.c2p_AddOptionInt("WINWIDTH",WWidth);
  375.         ClearMenuStrip(win);
  376.         CloseWindow(win);
  377.         win=NULL;
  378.     }
  379.     vec.c2p_Win=NULL;
  380.     if(mMenus) { FreeMenus(mMenus); mMenus=NULL; }
  381.     if(visualinfo) { FreeVisualInfo(visualinfo); visualinfo=NULL; }
  382.     if(vec.c2p_Scr) {
  383.         vec.c2p_AddOptionStr("PUBSCREEN",WPubName);
  384.         UnlockPubScreen(NULL,vec.c2p_Scr);
  385.         vec.c2p_Scr=NULL;
  386.     }
  387.     if(bmap) { FreeBitMap(bmap); bmap=NULL; }
  388.     if(bmap2) { FreeBitMap(bmap2); bmap2=NULL; }
  389.     if(bmapwpx) { FreeBitMap(bmapwpx); bmapwpx=NULL; }
  390.     if(tmpraswpx) { FreeVec(tmpraswpx); tmpraswpx=NULL; }
  391.     if(raswpx) { FreeVec(raswpx); raswpx=NULL; }
  392. } // freegfx()
  393.  
  394.  
  395. char *SAVEDS minit(ULONG scrmode, ULONG overscan, unsigned char *linedeltatab) {
  396.     int i;
  397.     char *s;
  398.  
  399.     c2p_OpenCatalog(defstr);
  400.  
  401.     if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",39))) return(STR(MSG_ERRGRAPHICS));
  402.     if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",37))) return(STR(MSG_ERRINTUITION));
  403.     if(!(GadToolsBase=OpenLibrary("gadtools.library",37))) return(STR(MSG_ERRGADTOOLS));
  404.     if(!(LayersBase=OpenLibrary("layers.library",33))) return(STR(MSG_ERRLAYERS));
  405.  
  406.     /* Set up pointer
  407.      */
  408.     if(NULL==(mypntchip0=AllocVec((POINTERHEIGHT+1)*2,MEMF_CHIP))) return(STR(MSG_NOMEM));
  409.     if(NULL==(mypntchip1=AllocVec((POINTERHEIGHT+1)*2,MEMF_CHIP))) return(STR(MSG_NOMEM));
  410.     CopyMem(pointerp0,mypntchip0,2*POINTERHEIGHT);
  411.     CopyMem(pointerp1,mypntchip1,2*POINTERHEIGHT);
  412.     InitBitMap(&mybmap,2,16,POINTERHEIGHT);
  413.     mybmap.Planes[0]=(PLANEPTR)mypntchip0;
  414.     mybmap.Planes[1]=(PLANEPTR)mypntchip1;
  415.     mypointer=NewObject(NULL,"pointerclass",
  416.         POINTERA_BitMap, (ULONG)&mybmap,
  417.         POINTERA_XOffset, -6,
  418.         POINTERA_WordWidth, 1,
  419.         POINTERA_XResolution, POINTERXRESN_SCREENRES,
  420.         POINTERA_YResolution, POINTERYRESN_SCREENRES,
  421.         TAG_DONE );
  422.     if(mypointer==NULL) return(STR(MSG_ERRPOINTER));
  423.  
  424.     /* Get Options
  425.      */
  426.     WTop=vec.c2p_GetOptionInt("WINTOP",-1);
  427.     WLeft=vec.c2p_GetOptionInt("WINLEFT",0);
  428.     WHeight=vec.c2p_GetOptionInt("WINHEIGHT",151);
  429.     WWidth=vec.c2p_GetOptionInt("WINWIDTH",179);
  430.     s=vec.c2p_GetOptionStr("PUBSCREEN","Workbench");
  431.     for(i=0;s[i]!='\0';i++);
  432.     if(NULL==(WPubName=AllocVec(i+2,MEMF_ANY))) return(STR(MSG_NOMEM));
  433.     CopyMem(s,WPubName,i+1);
  434.  
  435.     return(initgfx());
  436. } // init
  437.  
  438.  
  439. void SAVEDS mfree(void) {
  440.     freegfx();
  441.     if(mypntchip0) { FreeVec(mypntchip0); mypntchip0=NULL; }
  442.     if(mypntchip1) { FreeVec(mypntchip1); mypntchip1=NULL; }
  443.     if(mypointer) { DisposeObject(mypointer); mypointer=NULL; }
  444.     if(GfxBase) CloseLibrary((struct Library *)GfxBase);
  445.     if(IntuitionBase) { CloseLibrary((struct Library *)IntuitionBase); IntuitionBase=NULL; }
  446.     if(GadToolsBase) { CloseLibrary(GadToolsBase); GadToolsBase=NULL; }
  447.     if(LayersBase) CloseLibrary(LayersBase);
  448.     c2p_CloseCatalog();
  449.     return;
  450. } // free
  451.  
  452.  
  453. static int handleidcmp(void) {
  454.     struct IntuiMessage *imsg;
  455.     struct MenuItem *n;
  456.     int ret=RET_OK;
  457.     int (*func)(struct IntuiMessage *);
  458.  
  459.     while((imsg=(struct IntuiMessage *)RemHead(&vec.c2p_MsgList))) {
  460.         switch(imsg->Class) {
  461.             case IDCMP_CLOSEWINDOW :
  462.                 ret=RET_QUIT;
  463.                 break;
  464.             case IDCMP_MENUPICK :
  465.                 while(imsg->Code!=MENUNULL) {
  466.                     n=ItemAddress(mMenus,imsg->Code);
  467.                     func=(void *)(GTMENUITEM_USERDATA(n));
  468.                     ret=func(imsg);
  469.                     if(ret==RET_NEWWIN||ret==RET_ERROR) return(ret);
  470.                     imsg->Code=n->NextSelect;
  471.                 }
  472.                 break;
  473.         }
  474.     }
  475.     return(ret);
  476. } // handleidcmp
  477.  
  478.  
  479. static void getspeed(void) {
  480. static char title[]="WindowScale ...%";
  481. static int notitle=0;
  482. static int tbase=12;
  483.     int i,szam1;
  484.  
  485.     i=vec.c2p_Speed;
  486.     if(i>0) {
  487.         i+=5;
  488.         title[tbase+0]=' ';
  489.         if(i>1000) {
  490.             title[tbase+0]=(i/1000)+'0';
  491.             i%=1000;
  492.         }
  493.         szam1=i/100;
  494.         title[tbase+1]=' ';
  495.         if(szam1!=0) title[tbase+1]=szam1+'0';
  496.         else if(title[tbase+0]!=' ') title[tbase+1]=szam1+'0';
  497.         i%=100;
  498.         title[tbase+2]=(i/10)+'0';
  499.         title[tbase+3]='%';
  500.         SetWindowTitles(win,title,(UBYTE *)~0);
  501.         notitle=0;
  502.     } else {
  503.         title[tbase+0]=' ';
  504.         title[tbase+1]=' ';
  505.         title[tbase+2]=' ';
  506.         title[tbase+3]=' ';
  507.         if(notitle==0) SetWindowTitles(win,title,(UBYTE *)~0);
  508.         notitle=1;
  509.     }
  510. } // getspeed()
  511.  
  512.  
  513. int SAVEDS mdo(unsigned char *chunky,unsigned char *delta,int numscreen) {
  514.     getspeed();
  515.     return(mdofull(chunky,numscreen));
  516. } // do
  517.  
  518.  
  519. int SAVEDS mdofull(unsigned char *chunky,int numscreen) {
  520.     int ret,i;
  521.     unsigned char *p,*c;
  522.  
  523.     getspeed();
  524.     ret=handleidcmp();
  525.  
  526.     /* Convert chunky into PenArray
  527.      */    
  528.     i=SCRSIZE;
  529.     c=chunky;
  530.     p=PenArray;
  531.     do { *p++=PenTable[*c++]; } while(--i);
  532.  
  533.     if(ret!=RET_NEWWIN||ret!=RET_ERROR) {
  534.         /* Do the c2p
  535.          */
  536.         WritePixelArray8(raswpx,0,0,SCRWIDTH-1,SCRHEIGHT-1,PenArray,tmpraswpx);
  537.  
  538.         /* Scale It
  539.          */
  540.         scaleargs.bsa_DestWidth=win->GZZWidth;
  541.         scaleargs.bsa_DestHeight=win->GZZHeight;
  542.         scaleargs.bsa_XDestFactor=win->GZZWidth;
  543.         scaleargs.bsa_YDestFactor=win->GZZHeight;
  544.         BitMapScale(&scaleargs);
  545.  
  546.         /* Copy into the Window
  547.          */
  548.         LockLayerRom(win->WLayer);
  549.         BltBitMapRastPort(bmap2,0,0,win->RPort,0,0,win->GZZWidth,win->GZZHeight,0xc0);
  550.         UnlockLayerRom(win->WLayer);
  551.     }
  552.     return(ret);
  553. } // dofull
  554.  
  555.  
  556. int SAVEDS mdont(void) {
  557.     int ret;
  558.  
  559.     getspeed();
  560.     ret=handleidcmp();
  561.     return(ret);
  562. } // dont
  563.  
  564.  
  565. void SAVEDS msleep(void) {
  566.     if(win) {
  567.         InitRequester(&InvisibleRequester);
  568.         Request(&InvisibleRequester,win);
  569.         SetWindowPointer(win,WA_BusyPointer,TRUE,TAG_DONE);
  570.         winsleeped=1;
  571.     }
  572. }
  573.  
  574.  
  575. void SAVEDS mawake(void) {
  576.     if(winsleeped) {
  577.         if(win) {
  578.             EndRequest(&InvisibleRequester,win);
  579.             SetWindowPointer(win,TAG_DONE);
  580.             winsleeped=0;
  581.         }
  582.     }
  583. }
  584.